home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // Stars.c
- //
- // By Vern Jensen. Created 9/2/96
- ///--------------------------------------------------------------------------------------
-
- #include <SWFPSReport.h>
- #include <SWIncludes.h>
- #include <SWGameUtils.h>
-
- #include "SWApplication.h"
- #include "Stars.h"
-
-
- #define kFullScreenWindow true // Try me full screen!
- #define kWorldRectInset 0 // Make the SpriteWorld smaller?
- #define kSyncToVBL true // Sync SpriteWorld to VBL?
- #define kMaxFPS 0 // Set to 0 for unrestricted speed
-
- #define kNumStars 150
- #define kMinStarSpeed 1
- #define kMaxStarSpeed 3
-
- #define kNumSprites 2
- #define kBaseSpriteMoveDelta 2
-
- enum {kWhiteStars, kGrayStars, kColorStars};
-
- #define kStarColor kWhiteStars // Use kWhiteStars, kGrayStars, or kColorStars
-
-
-
- ///--------------------------------------------------------------------------------------
- // Globals
- ///--------------------------------------------------------------------------------------
-
- SpriteWorldPtr gSpriteWorldP;
- WindowPtr gWindowP;
- StarArray gStarArray[kNumStars];
-
- SpritePtr gSimpleSpriteArray[kNumSprites];
-
-
- ///--------------------------------------------------------------------------------------
- // Main
- ///--------------------------------------------------------------------------------------
-
- void main( void )
- {
- Initialize(kNumberOfMoreMastersCalls);
- Randomize();
-
- if ( SWHasSystem7() )
- {
- AllowKeyUpEvents(); // Part of SWGameUtils.c
- SetCursor(*GetCursor(watchCursor));
- HideControlStrip();
- SWSetCleanUpFunction(MyCleanUpFunction);
-
- CreateSpriteWorld();
- CreateSprites();
-
- SetCursor(&qd.arrow);
- HideCursor();
-
- RunAnimation();
- ShutDown();
-
- RestoreControlStrip(); // Call this after using HideControlStrip before quitting
- RestoreEventMask(); // Call this after using AllowKeyUpEvents before quitting
- }
- else
- {
- CantRunOnThisMachine();
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSpriteWorld
- ///--------------------------------------------------------------------------------------
-
- void CreateSpriteWorld( void )
- {
- Rect worldRect, windRect;
- RgnHandle mBarUpdateRgn;
- OSErr err;
- RGBColor black = { 0x0000, 0x0000, 0x0000 };
-
- gWindowP = GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (gWindowP != NULL)
- {
- // Allow it to run only in depths of 8 bits or greater.
- if ( GetDepthFromWindow(gWindowP) < 8 )
- {
- SetCursor(&qd.arrow);
- StopAlert(130, NULL);
- ExitToShell();
- }
-
- if (kFullScreenWindow == true)
- {
- SizeWindow(gWindowP, qd.screenBits.bounds.right,
- qd.screenBits.bounds.bottom, false);
- MoveWindow(gWindowP, 0, 0, false);
- }
- else
- {
- // Center window in screen
- windRect = gWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow(gWindowP, windRect.left, windRect.top, false);
- }
-
- ShowWindow(gWindowP);
- SetPort(gWindowP);
- mBarUpdateRgn = SWHideMenuBar(gWindowP); // Must be done *after* showing window!
- EraseRgn(mBarUpdateRgn);
-
- ForeColor(blackColor);
- BackColor(whiteColor);
- }
- else
- CantFindResource();
-
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- worldRect = gWindowP->portRect;
- InsetRect(&worldRect, kWorldRectInset, kWorldRectInset);
-
-
- // Create the sprite world
- err = SWCreateSpriteWorldFromWindow(&gSpriteWorldP, (CWindowPtr)gWindowP,
- &worldRect, NULL, 0);
- FatalError(err);
-
- // set to clear proc for extra speed
- if ( gSpriteWorldP->pixelDepth >= 8 )
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, BlitPixieClearDrawProc);
- else
- SWSetSpriteWorldOffscreenDrawProc(gSpriteWorldP, SWStdWorldClearDrawProc);
-
- SWSetSpriteWorldScreenDrawProc(gSpriteWorldP, BlitPixieRectDrawProc);
-
- SWSetBackgroundColor( gSpriteWorldP, &black );
-
- SWSetSpriteWorldMaxFPS(gSpriteWorldP, kMaxFPS);
- SWSyncSpriteWorldToVBL(gSpriteWorldP, kSyncToVBL);
- SWSetCleanUpSpriteWorld(gSpriteWorldP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // CreateSprites
- ///--------------------------------------------------------------------------------------
-
- void CreateSprites( void )
- {
- SpriteLayerPtr spriteLayerP;
- SpritePtr simpleSpriteP;
- DrawProcPtr spriteDrawProc;
- short spriteNum;
- OSErr err;
-
-
- err = SWCreateSpriteLayer(&spriteLayerP);
- FatalError(err);
-
- err = SWCreateSpriteFromCicnResource(gSpriteWorldP, &simpleSpriteP, NULL,
- 128, 1, kFatMask);
- FatalError(err);
-
- #if SW_68K
- // Compiled Sprites are slightly faster than RLE Sprites.
- SWCompileSprite(simpleSpriteP);
- spriteDrawProc = BlitPixieCompiledSpriteDrawProc;
- #else
- // However, Compiled Sprites are not available for PPC.
- SWCreateRLEData(simpleSpriteP);
- spriteDrawProc = BlitPixieRLEDrawProc;
- #endif
-
- gSimpleSpriteArray[0] = simpleSpriteP;
-
- for (spriteNum = 1; spriteNum < kNumSprites; spriteNum++)
- {
- err = SWCloneSprite(simpleSpriteP, &gSimpleSpriteArray[spriteNum], NULL);
- FatalError(err);
- }
-
-
- for (spriteNum = 0; spriteNum < kNumSprites; spriteNum++)
- {
- simpleSpriteP = gSimpleSpriteArray[spriteNum];
-
- SWAddSprite(spriteLayerP, simpleSpriteP);
- SWSetSpriteMoveBounds(simpleSpriteP, &gSpriteWorldP->backRect);
- SWSetSpriteMoveProc(simpleSpriteP, BallSpriteMoveProc);
- SWSetSpriteMoveDelta(simpleSpriteP, kBaseSpriteMoveDelta + spriteNum,
- kBaseSpriteMoveDelta + spriteNum);
- SWSetSpriteLocation(simpleSpriteP, spriteNum * 60, spriteNum * 60);
- SWSetSpriteDrawProc(simpleSpriteP, spriteDrawProc);
- }
-
- SWAddSpriteLayer(gSpriteWorldP, spriteLayerP);
- SWLockSpriteWorld(gSpriteWorldP);
-
- SWSetPortToBackground(gSpriteWorldP);
- PaintRect(&gSpriteWorldP->backRect);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // RunAnimation
- ///--------------------------------------------------------------------------------------
-
- void RunAnimation( void )
- {
- unsigned long frames;
- RGBColor rgbColor;
- long blackIndex;
-
- rgbColor.red = rgbColor.blue = rgbColor.green = 0;
- blackIndex = Color2Index(&rgbColor);
-
- SetUpStars();
- SWUpdateSpriteWorld(gSpriteWorldP, true);
- SWAnimateStarField(gSpriteWorldP, gStarArray, kNumStars, blackIndex);
-
- frames = 0;
- StartTimer();
-
- FatalError( SWStickyError() ); // Make sure no errors got past us during setup
-
- while (!Button())
- {
- SWProcessSpriteWorld(gSpriteWorldP);
- FatalError( SWStickyError() ); // Make sure no errors occurred during a MoveProc, etc.
- SWAnimateSpriteWorld(gSpriteWorldP);
-
- if (gSpriteWorldP->frameHasOccurred)
- {
- MoveStars();
- SWAnimateStarField(gSpriteWorldP, gStarArray, kNumStars, blackIndex);
-
- frames++;
- }
- }
-
-
- SWShowMenuBar(gWindowP);
- ShowResults(frames);
- }
-
- #pragma mark -
-
- ///--------------------------------------------------------------------------------------
- // ShutDown (clean up and dispose of the SpriteWorld)
- ///--------------------------------------------------------------------------------------
-
- void ShutDown( void )
- {
- SWDisposeSpriteWorld(&gSpriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- InitCursor();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // MyCleanUpFunction - called if an error occurs, to clean up before quitting
- ///--------------------------------------------------------------------------------------
-
- void MyCleanUpFunction( void )
- {
- SWShowMenuBar(gWindowP);
-
- RestoreControlStrip();
- RestoreEventMask();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallSpriteMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BallSpriteMoveProc(SpritePtr ballSpriteP)
- {
- SWOffsetSprite(ballSpriteP, ballSpriteP->horizMoveDelta, ballSpriteP->vertMoveDelta);
- (void)SWBounceSprite(ballSpriteP);
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpStars
- ///--------------------------------------------------------------------------------------
-
- void SetUpStars( void )
- {
- short curStar, value;
- RGBColor rgbColor;
- long colorIndex;
- Rect windRect = gSpriteWorldP->windowFrameP->frameRect;
-
- for (curStar = 0; curStar < kNumStars; curStar++)
- {
- if (kStarColor == kWhiteStars)
- {
- rgbColor.red = rgbColor.green = rgbColor.blue = 65535;
- }
- else if (kStarColor == kGrayStars)
- {
- value = GetUnsignedRandom(15000, 65534);
- rgbColor.red = rgbColor.green = rgbColor.blue = value;
- }
- else
- {
- rgbColor.red = GetUnsignedRandom(0, 65534);
- rgbColor.green = GetUnsignedRandom(0, 65534);
- rgbColor.blue = GetUnsignedRandom(0, 65534);
- }
-
- colorIndex = Color2Index(&rgbColor);
-
- gStarArray[curStar].horizLoc = GetRandom(windRect.left, windRect.right-1);
- gStarArray[curStar].vertLoc = GetRandom(windRect.top, windRect.bottom-1);
- gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
- gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
- gStarArray[curStar].horizSpeed = GetRandom(kMinStarSpeed, kMaxStarSpeed);
- gStarArray[curStar].color = colorIndex;
- gStarArray[curStar].isOn = true;
-
- // Since the star hasn't been drawn yet, it doesn't need to be erased.
- gStarArray[curStar].needsToBeErased = false;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // MoveStars
- ///--------------------------------------------------------------------------------------
-
- void MoveStars( void )
- {
- short curStar;
- Rect* windRectP = &gSpriteWorldP->windowFrameP->frameRect;
-
- for (curStar = 0; curStar < kNumStars; curStar++)
- {
- // Save the old position
- gStarArray[curStar].oldHorizLoc = gStarArray[curStar].horizLoc;
- gStarArray[curStar].oldVertLoc = gStarArray[curStar].vertLoc;
-
- gStarArray[curStar].horizLoc += gStarArray[curStar].horizSpeed;
- if (gStarArray[curStar].horizLoc > windRectP->right)
- {
- gStarArray[curStar].vertLoc = GetRandom( windRectP->top, windRectP->bottom-1 );
- gStarArray[curStar].horizLoc -= (windRectP->right - windRectP->left);
- }
-
- /*
- // Change star color (try uncommenting this for a neat effect)
- gStarArray[curStar].color++;
- if (gStarArray[curStar].color >= 255)
- gStarArray[curStar].color -= 255;
- */
- }
- }
-
-